package com.thaiopensource.validate.nvdl;

/**
 * Stores a set of element actions. The actions are result actions and no result
 * actions. An action set contains only one result action and more no result
 * actions.
 */
class ActionSet
{
  /**
   * The result action.
   */
  private ResultAction resultAction;
  /**
   * The no result actions.
   */
  private NoResultAction [] noResultActions = new NoResultAction [0];

  /**
   * Cancel nested actions flag.
   */
  private boolean cancelNestedActions;

  /**
   * Getter for the result action.
   * 
   * @return The result action.
   */
  ResultAction getResultAction ()
  {
    return resultAction;
  }

  /**
   * Setter for the result action.
   * 
   * @param resultAction
   *        The result action.
   */
  void setResultAction (final ResultAction resultAction)
  {
    this.resultAction = resultAction;
  }

  /**
   * Adds a no result action to the no result actions.
   * 
   * @param action
   *        The no result action.
   */
  void addNoResultAction (final NoResultAction action)
  {
    final NoResultAction [] actions = new NoResultAction [noResultActions.length + 1];
    System.arraycopy (noResultActions, 0, actions, 0, noResultActions.length);
    actions[noResultActions.length] = action;
    noResultActions = actions;
  }

  /**
   * Getter for the no result actions array.
   * 
   * @return The no result actions.
   */
  NoResultAction [] getNoResultActions ()
  {
    return noResultActions;
  }

  /**
   * Getter for the cancel nested actions flag.
   */
  boolean getCancelNestedActions ()
  {
    return cancelNestedActions;
  }

  /**
   * Set the cancel nested actions flag.
   * 
   * @param cancelNestedActions
   *        The new value.
   */
  void setCancelNestedActions (final boolean cancelNestedActions)
  {
    this.cancelNestedActions = cancelNestedActions;
  }

  /**
   * Gets a new ActionSet containing all the actions with the current mode
   * changed.
   * 
   * @param mode
   *        The new current mode.
   * @return A new ActionSet with actions with the current mode changed.
   */
  ActionSet changeCurrentMode (final Mode mode)
  {
    final ActionSet actions = new ActionSet ();
    if (this.resultAction != null)
      actions.resultAction = this.resultAction.changeCurrentMode (mode);
    actions.noResultActions = new NoResultAction [this.noResultActions.length];
    for (int i = 0; i < actions.noResultActions.length; i++)
      actions.noResultActions[i] = this.noResultActions[i].changeCurrentMode (mode);
    return actions;
  }
}
